package main.java.com.zzc.auto;

import main.java.com.zzc.auto.utils.Constant;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.*;
import java.net.URL;
import java.util.Properties;
import java.util.Timer;
import java.util.TimerTask;

public class AutoShutdown {

    private static final String CONFIG_FILE = "user.properties";
    private static JLabel countdownLabel;
    private static Timer timer;
    private static long shutdownTime;  // 关机时间的时间戳

    public static void main(String[] args) {
        // 创建主框架窗口，增大窗口尺寸
        JFrame frame = new JFrame("自动关机小程序");
        // 设置窗体图标
        Image image = Toolkit.getDefaultToolkit().getImage(AutoShutdown.class.getResource("/main/resources/assets/frameIcon.png"));
        ImageIcon icon = new ImageIcon(image.getScaledInstance(48, 48, Image.SCALE_SMOOTH)); // 调整为适当大小
        frame.setIconImage(icon.getImage());

        // 读取配置文件中的选择
        Properties properties = loadProperties();
        String userChoice = properties.getProperty("userChoice", Constant.MINIMIZE);

        // 默认选项：最小化到托盘
        if (userChoice.equals(Constant.MINIMIZE)) {
            frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // 取消默认关闭操作
        } else {
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }

        frame.setSize(500, 300);  // 增大窗口尺寸
        frame.setLayout(new GridBagLayout());  // 使用 GridBagLayout 来实现布局

        // 设置菜单栏
        JMenuBar menuBar = new JMenuBar();
        JMenu settingsMenu = new JMenu("设置"); // 设置菜单
        JMenuItem settingsItem = new JMenuItem("设置选项"); // 菜单项

        // 设置菜单项点击事件
        settingsItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 打开设置窗口
                showSettingsWindow(frame);
            }
        });

        // 将菜单项添加到菜单中
        settingsMenu.add(settingsItem);
        menuBar.add(settingsMenu); // 将菜单添加到菜单栏

        // 设置菜单栏到主窗口
        frame.setJMenuBar(menuBar);

        // 设置窗口可见
        frame.setVisible(true);

        // 实现最小化到托盘功能
        if (SystemTray.isSupported()) {
            SystemTray systemTray = SystemTray.getSystemTray();
            TrayIcon trayIcon = createTrayIcon(frame); // 创建托盘图标

            // 窗口关闭事件，改为最小化到托盘
            frame.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    // 先最小化窗口
                    frame.setVisible(false);
                    // 将程序图标添加到托盘
                    try {
                        systemTray.add(trayIcon);
                    } catch (AWTException ex) {
                        ex.printStackTrace();
                    }
                }
            });

            // 托盘图标的双击事件：恢复窗口
            trayIcon.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    frame.setVisible(true); // 恢复窗口
                    systemTray.remove(trayIcon); // 从托盘中移除图标
                }
            });
        } else {
            JOptionPane.showMessageDialog(frame, "系统托盘不支持，无法启用此功能！");
        }

        // 创建 GridBagConstraints，用于控制布局
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.insets = new Insets(15, 15, 5, 15);  // 设置控件之间的间距，减少上下间距

        // 设置支持中文的字体
        Font font = new Font("Microsoft YaHei", Font.PLAIN, 16);
        Font labelFont = new Font("Microsoft YaHei", Font.PLAIN, 18);  // 设置标签字体更大

        // 创建小时选择器标签和下拉框
        JLabel hourLabel = new JLabel("小时：");
        hourLabel.setFont(labelFont);  // 设置标签字体更大
        JComboBox<String> hourComboBox = new JComboBox<>();
        for (int i = 0; i < 24; i++) {
            hourComboBox.addItem(String.format("%02d", i));
        }
        hourComboBox.setFont(font);  // 设置字体大小
        hourComboBox.setPreferredSize(new Dimension(100, 30));  // 设置宽度

        // 创建分钟选择器标签和下拉框
        JLabel minuteLabel = new JLabel("分钟：");
        minuteLabel.setFont(labelFont);  // 设置标签字体更大
        JComboBox<String> minuteComboBox = new JComboBox<>();
        for (int i = 0; i < 60; i++) {
            minuteComboBox.addItem(String.format("%02d", i));
        }
        minuteComboBox.setFont(font);  // 设置字体大小
        minuteComboBox.setPreferredSize(new Dimension(100, 30));  // 设置宽度

        // 创建确定按钮
        JButton okButton = new JButton("确定");
        okButton.setFont(font);  // 设置字体大小
        okButton.setPreferredSize(new Dimension(80, 40));  // 设置按钮大小
        okButton.setFocusPainted(false);  // 去除按钮点击后的焦点框
        okButton.setBorderPainted(false);  // 去除按钮的边框

        // 创建取消按钮
        JButton cancelButton = new JButton("取消");
        cancelButton.setFont(font);  // 设置字体大小
        cancelButton.setPreferredSize(new Dimension(80, 40));  // 设置按钮大小
        cancelButton.setFocusPainted(false);  // 去除按钮点击后的焦点框
        cancelButton.setBorderPainted(false);  // 去除按钮的边框

        // 创建倒计时标签
        countdownLabel = new JLabel("0:00");
        countdownLabel.setFont(new Font("Microsoft YaHei", Font.BOLD, 40));
        countdownLabel.setForeground(Color.RED);

        // 处理确定按钮点击事件
        okButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String hour = (String) hourComboBox.getSelectedItem();
                String minute = (String) minuteComboBox.getSelectedItem();

                int hours = Integer.parseInt(hour);
                int minutes = Integer.parseInt(minute);

                // 计算关机时间
                long currentTime = System.currentTimeMillis();
                long targetTime = getTargetTime(hours, minutes);

                // 如果目标时间在当前时间之前，则计算为第二天的目标时间
                if (targetTime <= currentTime) {
                    targetTime += 24 * 60 * 60 * 1000;  // 加上24小时，表示第二天的目标时间
                }

                shutdownTime = targetTime;

                // 启动倒计时
                startCountdown();
            }
        });

        // 处理取消按钮点击事件
        cancelButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //hourComboBox.setSelectedIndex(0);  // 重置小时选择框
                //minuteComboBox.setSelectedIndex(0);  // 重置分钟选择框
                countdownLabel.setText("0:00");  // 重置倒计时
                if (timer != null) {
                    timer.cancel();  // 取消倒计时任务
                }
            }
        });

        // 使用 GridBagLayout 添加组件
        // 设置第一行：小时标签和下拉框与确定按钮
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.anchor = GridBagConstraints.WEST;  // 标签和选择框整体向左对齐
        frame.add(hourLabel, gbc);

        gbc.gridx = 1;
        frame.add(hourComboBox, gbc);

        gbc.gridx = 2;  // 确定按钮放在这一列
        frame.add(okButton, gbc);

        // 设置第二行：分钟标签和下拉框与取消按钮
        gbc.gridx = 0;
        gbc.gridy = 1;
        frame.add(minuteLabel, gbc);

        gbc.gridx = 1;
        frame.add(minuteComboBox, gbc);

        gbc.gridx = 2;  // 取消按钮放在这一列
        frame.add(cancelButton, gbc);

        // 设置倒计时标签
        gbc.gridx = 0;
        gbc.gridy = 2;
        gbc.gridwidth = 3;  // 倒计时标签跨越三列
        gbc.anchor = GridBagConstraints.CENTER;  // 倒计时标签居中
        frame.add(countdownLabel, gbc);

        // 设置窗口居中显示
        frame.setLocationRelativeTo(null);  // 窗口居中
        // 设置窗口可见
        frame.setVisible(true);
    }

    // 计算目标时间的时间戳
    private static long getTargetTime(int hour, int minute) {
        // 获取当前日期的年、月、日
        java.util.Calendar calendar = java.util.Calendar.getInstance();
        calendar.set(java.util.Calendar.HOUR_OF_DAY, hour);
        calendar.set(java.util.Calendar.MINUTE, minute);
        calendar.set(java.util.Calendar.SECOND, 0);
        calendar.set(java.util.Calendar.MILLISECOND, 0);
        return calendar.getTimeInMillis();
    }

    // 启动倒计时任务
    private static void startCountdown() {
        // 取消之前的任务
        if (timer != null) {
            timer.cancel();
        }

        // 创建一个新的定时器任务
        timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                long currentTime = System.currentTimeMillis();
                long timeRemaining = shutdownTime - currentTime;

                if (timeRemaining <= 0) {
                    timer.cancel();  // 关机倒计时结束，取消定时器
                    countdownLabel.setText("0:00");
                    //JOptionPane.showMessageDialog(null, "时间到，系统将关机！");
                    try {
                        // 执行关机命令
                        Runtime.getRuntime().exec("shutdown -s -t 0");  // 立即关机
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                } else {
                    long hours = timeRemaining / 3600000;
                    long minutes = (timeRemaining % 3600000) / 60000;
                    long seconds = (timeRemaining % 60000) / 1000;

                    countdownLabel.setText(String.format("%02d:%02d:%02d", hours, minutes, seconds));
                }
            }
        }, 0, 1000);  // 每秒执行一次
    }

    // 设置窗口，供用户选择最小化到托盘或关闭程序
    private static void showSettingsWindow(JFrame parentFrame) {
        JFrame settingsFrame = new JFrame("点击关闭时");
        settingsFrame.setSize(300, 150); // 设置设置窗口的大小
        settingsFrame.setLayout(new FlowLayout());
        // 读取配置文件中的选择
        Properties properties = loadProperties();
        String userChoice = properties.getProperty("userChoice", Constant.MINIMIZE);

        // 创建单选按钮
        JRadioButton minimizeToTrayButton = new JRadioButton("最小化到托盘");
        JRadioButton closeProgramButton = new JRadioButton("关闭程序");
        minimizeToTrayButton.setFocusPainted(false);
        closeProgramButton.setFocusPainted(false);

        // 创建按钮组，使得两个单选按钮互斥
        ButtonGroup group = new ButtonGroup();
        group.add(minimizeToTrayButton);
        group.add(closeProgramButton);

        // 默认选项：最小化到托盘
        if (userChoice.equals(Constant.MINIMIZE)) {
            minimizeToTrayButton.setSelected(true);
        } else {
            closeProgramButton.setSelected(true);
        }

        // 添加组件到设置窗口
        settingsFrame.add(minimizeToTrayButton);
        settingsFrame.add(closeProgramButton);

        // 创建确认按钮，用户点击后可以关闭设置窗口
        JButton confirmButton = new JButton("确定");
        settingsFrame.add(confirmButton);

        // 点击确认按钮后保存设置并关闭设置窗口
        confirmButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 保存用户选择
                if (minimizeToTrayButton.isSelected()) {
                    parentFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                    saveUserChoice(Constant.MINIMIZE);
                } else if (closeProgramButton.isSelected()) {
                    parentFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    saveUserChoice(Constant.CLOSE);
                }
                settingsFrame.dispose(); // 关闭设置窗口
            }
        });

        settingsFrame.setLocationRelativeTo(parentFrame); // 设置相对于主窗口的位置
        settingsFrame.setVisible(true); // 显示设置窗口
    }

    // 创建托盘图标的方法
    private static TrayIcon createTrayIcon(JFrame frame) {
        // 通过类路径获取图标图片路径
        Image image = Toolkit.getDefaultToolkit().getImage(AutoShutdown.class.getResource("/main/resources/assets/AlarmClock.png"));
        TrayIcon trayIcon = new TrayIcon(image, "自动关机小程序");

        // 添加托盘图标的鼠标点击事件
        trayIcon.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                frame.setVisible(true); // 恢复窗口
                SystemTray.getSystemTray().remove(trayIcon); // 从托盘中移除图标
            }
        });

        // 托盘图标的右键菜单（可选）
        PopupMenu popupMenu = new PopupMenu();
        MenuItem exitItem = new MenuItem("退出");

        // 设置菜单项字体，确保使用支持中文的字体
        exitItem.setFont(new Font("Microsoft YaHei", Font.PLAIN, 14));
        exitItem.setLabel("退出");

        exitItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0); // 退出程序
            }
        });
        
        popupMenu.add(exitItem);
        trayIcon.setPopupMenu(popupMenu);

        return trayIcon;
    }

    // 加载配置文件
    private static Properties loadProperties() {
        Properties properties = new Properties();
        try (InputStream inputStream = new FileInputStream(CONFIG_FILE)) {
            properties.load(inputStream);
        } catch (IOException e) {
            // 如果文件不存在，则使用默认配置
            System.out.println("配置文件未找到，使用默认值.");
        }
        return properties;
    }

    // 保存用户选择到配置文件
    private static void saveUserChoice(String choice) {
        Properties properties = new Properties();
        properties.setProperty("userChoice", choice);

        try (OutputStream outputStream = new FileOutputStream(CONFIG_FILE)) {
            properties.store(outputStream, "User preferences");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
